var Article = require('./article.js');
// 插件官方解释
// Request is designed to be the simplest way possible to make http calls. 
// It supports HTTPS and follows redirects by default.
var request = require("request");
// 插件官方解释
// Cheerio解析标记并提供用于遍历/操纵结果数据结构的API。
// 它不会像Web浏览器那样解释结果。
// 具体而言，它并不会产生视觉呈现，应用CSS，加载外部资源，或者执行JavaScript。
// 如果您的用例需要任何此功能，则应考虑PhantomJS或JSDom等项目。
var cheerio = require("cheerio");
var fs = require("fs");
var articles = [];
// 用于将对象转为数组，插入数据库
// 只能用这种很low的方法确定所有异步执行完毕了......
var task = 0;
// 文章的实体类
var Proxy = require('./proxy.js');
var baseURL = 'https://www.thepaper.cn/';
// 一般一个页面需要获取头条和普通文章
function getInfo(url) {
    request({
        url: url,
        headers: {
            "X-Forwarded-For": Proxy.GetProxy(),
        },
        method: 'GET'
    }, function (err, result) {
        if (err) {
            console.log("错误：" + err);
        }
        let $ = cheerio.load(result.body);
        // 本页所属一级版块名称
        var top_part = $('.index a').text();
        var img, title, link, content_short, subtype, date, tag, content_full, author, comments, editor, keywords, copyright;
        // 
        img = 'https:' + $('.pdtt01 .pdtt_lt img').attr('src')||""; //图片
        title = $('.pdtt01 .pdtt_lt img').attr('alt')||"";// 标题
        link = baseURL + $('.pdtt01 .pdtt_lt a').attr('href')||""; // 详情链接
        content_short = $('.pdtt01 .pdtt_rt .pdtt_rtbd p').text().replace(/\n/g, "").replace(/^\s*|\s*$/g, "")||""; //文章纲要
        subtype = $('.pdtt01 .pdtt_rt .pdtt_trbs a').text()||""; // 二级分类
        // date = $('.pdtt01 .pdtt_rt .pdtt_trbs a+span').text()||"";  // 发布时间(x小时前)
        tag = $('.pdtt01 .pdtt_rt .pdtt_trbs .trbstxt').text()||"";  // 新闻tag
        // console.log(link);
        // A:头条内容
        // 处理文章详情页的相关内容
        var article = new Article(null, title, date, link, content_full, content_short, img, author, comments, tag, top_part, subtype, editor, keywords, copyright);
        articles.push(article);
        // 这个可以复用
        getDetail(link, article);
        task++;
        // 普通文章有懒加载效果，最后的news_li控制加载的情况，一般异步ajax加载的格式：
        // https://www.thepaper.cn/load_chosen.jsp?nodeids=25949&topCids=2313537,2313584,2313720,2308649,&pageidx=4&lastTime=1533177155373
        if ($('#mainContent .newsbox .news_li') != '') {
            $('#mainContent .newsbox .news_li').each(function (i, elem) {
                // A:获取普通文章列表中的文章
                var img, title, link, content_short, subtype, date, tag, content_full, author, comments, editor, keywords, copyright;
                // 会有一个最后控制懒加载的div，感觉可以少个判断
                img = 'https:' + $(this).find('.news_tu img').attr('src')||""; // 图片
                title = $(this).find('.news_tu img').attr('alt')||""; // 标题
                link = baseURL + $(this).find('.news_tu a').attr('href')||"";  // 详情链接
                // 这个会有转义字符
                content_short = $(this).find('p').text().replace(/\n/g, "").replace(/^\s*|\s*$/g, "")||""; // 文章纲要
                subtype = $(this).find('.pdtt_trbs a').text()||"";  // 二级分类
                // date = $(this).find('.pdtt_trbs a+span').text(); // 发布时间
                tag = $(this).find('.pdtt_trbs .trbstxt').text()||"";// 新闻tag
                if ($(this).html() != '') {
                    var article = new Article(null, title, date, link, content_full, content_short, img, author, comments, tag, top_part, subtype, editor, keywords, copyright);
                    articles.push(article);
                    // 这个可以复用
                    getDetail(link, article);
                    task++;
                }
            });
        }

    })
}
// 文章详情页的内容
function getDetail(link, article) {
    console.log(task);
    request({
        url: link,
        headers: {
            "X-Forwarded-For": Proxy.GetProxy(),
        },
        method: 'GET'
    }, function (err, result) {
        if (err) { task--; console.log(err); }
        else {
            let $ = cheerio.load(result.body);
            // console.log(link + "-----" + $('.news_txt').length);
            // 判断是否是这个页面
            // 还有可能是视频新闻，这个时候元素又不一样，先处理date
            if ($('.news_txt').length !== 0) {
                article.content_full = $('.news_txt').html()||"";
                // article.content_full = undefined||"";
                article.author = $('.news_about').children().first().text()||"";
                // article.date = $('.news_about').children().first().next().text().replace(/[\u4e00-\u9fa5]/g, "").replace(/\n/g,"").replace(/^\s*|\s*$/g,"");
                article.date = $('.news_about').children().first().next().text().match(/\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}/)[0];//2018-08-05 13:30
                article.copyright = $('.news_about').children().first().next().find('span').text().replace(/\n/g, "").replace(/^\s*|\s*$/g, "")||"";
                // 这个结构稍微麻烦点,而且会有不存在子元素的情况，我是醉了
                // console.log(link + "-----" + $('.news_editor').children());
                // 判断是否有子span元素
                if ($('.news_editor').children() != '') {
                    article.editor = $('.news_editor').children()[0].prev.data.split('：')[1];
                } else {
                    article.editor = $('.news_editor').text();
                }
                article.keywords = $('.news_keyword').text().split(" >> ")[1]||"";
            }
            // 处理视频的日期，不然为空sql出错，其他为空暂时不管
            // console.log(
            //     $('.video_info_left').length+"===="+
            //     ($('.video_info_left').html())
            // );
            
            if($('.video_main').length!==0){
                article.date = $('.video_main .video_info_left').child().find('span').first().text();
                // article.date = $('.video_main .video_info_left').html();
                console.log("日期："+article.date);
            }
        } task--;
        console.log(task);
        if (task === 0) {
            fs.writeFile('articles.json', JSON.stringify(articles), function () {
                console.log('---写入完成!---');
            });
        }
    })
}
getInfo(baseURL);
